package main

import (
	"encoding/json"
	"fmt"
)

// 结构体属性的tag，转换成json时转小写
type User struct {
	Id       int    `json:"id"`
	Name     string `json:"name"`
	Password string `json:"-"` // 忽略转换password

	age  int
	Tel  string `json:"tel"`
	Addr string `json:"addr"`
}

func main() {
	// 编码
	user := User{1, "sonfer", "111", 23, "xx", "xxx"}
	// 内存结构 ==>	[]byte	（编码）
	// []byte	==>	内存结构 （解码）

	if j, err := json.Marshal(user); err == nil {
		fmt.Println(string(j))
	}
	// 用来调试，可视化输出，第二个参数一般设置为空，第三个参数表示缩进
	if j, err := json.MarshalIndent(user, "", "\t"); err == nil {
		fmt.Println(string(j))
	}

	// 解码
	var user2 User
	ctx := `{"Id":1,"Name":"sonfer","Password":"111","Tel":"xx","Add":"xxx"}`

	// 判断是否为json格式字符串
	if ok := json.Valid([]byte(ctx)); ok {
		fmt.Println(ok)
	}
	if err := json.Unmarshal([]byte(ctx), &user2); err == nil {
		fmt.Printf("%#v\n", user2)
	} else {
		fmt.Println(err)
	}

}
